package com.lvhx.service;

import com.lvhx.dao.UserMapper;
import com.lvhx.pojo.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.retry.annotation.Backoff;
import org.springframework.retry.annotation.Recover;
import org.springframework.retry.annotation.Retryable;
import org.springframework.stereotype.Service;

import java.util.Random;

@Service
public class UserService {

    @Autowired
    private UserMapper userMapper;
    
    private static final Random random = new Random();
    
    /**
     * 获取用户信息 - 可能失败的方法
     * @param userId 用户ID
     * @return 用户信息JSON
     * @throws UserServiceException 当服务不可用时抛出
     */
    @Retryable(
        value = {UserServiceException.class}, // 捕获的异常类型
        maxAttempts = 3,                     // 最大重试次数
        backoff = @Backoff(delay = 2000)     // 重试间隔2秒
    )
    public String getUserInfo(String userId) throws UserServiceException {
        System.out.println("尝试调用用户信息服务，用户ID: " + userId + "，时间: " + System.currentTimeMillis());
        
        // 模拟服务调用 - 70%概率失败
        if (random.nextDouble() < 0.7) {
            throw new UserServiceException("用户服务暂时不可用");
        }else {
            User user = userMapper.selectByPrimaryKey(userId);
            return user.toString();
        }
        
    }
    
    /**
     * 恢复方法 - 当所有重试都失败后调用
     * @param e 异常
     * @param userId 用户ID
     * @return 默认用户信息
     */
    @Recover
    public String getUserInfoFallback(UserServiceException e, String userId) {
        System.err.println("所有重试失败，使用默认用户信息，用户ID: " + userId);
        return "{'id':'"+userId+"','name':'默认用户','age':0}";
    }
}

// 自定义异常类
class UserServiceException extends Exception {
    public UserServiceException(String message) {
        super(message);
    }
}